# Comandos
CC     = gcc
CFLAGS = -g -Wall --pedantic --std=c99 -I.
MATH   = -lm
VALG   = valgrind --track-origins=yes --leak-check=full
RM     = rm -f
RMDIR  = rm -f -r

# Directorios de cada tipo de archivo
SRCDIR   = src
# no cambiar LIBDIR por el momento
LIBDIR   = src
OBJDIR   = obj
EXEDIR   = exe
RESDIR   = res
TMPDIR   = tmp

# Wildcards
SOURCES     := $(wildcard $(SRCDIR)/*.c)
OBJECTS     := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
INCLUDES    := $(wildcard $(LIBDIR)/*.h)
BIBLIOTECAS := $(INCLUDES:$(LIBDIR)/%.h=$(OBJDIR)/%.o)

RESOURCES   := $(wildcard $(RESDIR)/*)
RECURSOS    := $(RESOURCES:$(RESDIR)/%=%)

# Ejecutables
PROGRAMA = main
PRUEBAS  = prueba_pila prueba_abb prueba_lista prueba_heap prueba_hash \
           prueba_vector_dinamico prueba_GeneradorIndice \
           prueba_ManejadorArchivos prueba_Ubicador prueba_ElementoParseado \
           prueba_Parser prueba_ParserYManejador prueba_Indice \
           prueba_vectorBinario prueba_codigos prueba_ManejadorBits main-2 \
           prueba_IndiceMem

EXES     = $(PROGRAMA) $(PRUEBAS)

# ########## #
# DIRECTIVAS #
# ########## #

all: CleanAll $(OBJECTS) $(EXES)

# Creacion de directorios y recursos
$(OBJDIR):
	@mkdir $(OBJDIR)
	@echo "DIRECTORIO:"
	@echo "	. La carpeta '"$@"' ha sido creada exitosamente!"
	@echo "\nCOMPILACIONES:"

recursos:
	@cp $(RESDIR)/*.* .
	@echo "\nRECURSOS:"
	@echo "	. Los recursos han sido copiados exitosamente!"
	@echo "\nCONSTRUCCIONES:"

# Compilacion de las bibliotecas
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c | $(OBJDIR)
	@$(CC) $(CFLAGS) -c $< -o $@
	@echo "	. "$*".c ha sido compilado exitosamente!"

# Construccion de ejecutables
$(EXES): % : $(BIBLIOTECAS) recursos
	@$(CC) -o $* $(CFLAGS) $(OBJDIR)/$*.o $(BIBLIOTECAS) $(MATH)
	@echo "	. El ejecutable "$*" ha sido creado exitosamente!"

# EJECUCION DE PRUEBAS DE BIBLIOTECAS
ejecutar_pila: prueba_pila
	@$(VALG) ./$<

ejecutar_abb: prueba_abb
	@$(VALG) ./$<
	@$(VALG) ./$< 100000

ejecutar_lista: prueba_lista
	@$(VALG) ./$<

ejecutar_heap: prueba_heap
	@$(VALG) ./$<
	@$(VALG) ./$< 100000

ejecutar_hash: prueba_hash
	@$(VALG) ./$<
	@$(VALG) ./$< 100000

ejecutar_vd: prueba_vector_dinamico
	@$(VALG) ./$<

ejecutar_Manejador: prueba_ManejadorArchivos
	@$(VALG) ./$<

ejecutar_Ubicador: prueba_Ubicador
	@$(VALG) ./$<

ejecutar_ElementoParseado: prueba_ElementoParseado
	@$(VALG) ./$<

ejecutar_Parser: prueba_Parser
	@$(VALG) ./$<

ejecutar_GeneradorIndice: prueba_GeneradorIndice
	@$(VALG) ./$<
	
ejecutar_ParserYManejador: prueba_ParserYManejador
	@$(VALG) ./$<

ejecutar_Indice: prueba_Indice
	@$(VALG) ./$<

ejecutar_vectorBinario: prueba_vectorBinario
	@$(VALG) ./$<

ejecutar_codigos: prueba_codigos
	@$(VALG) ./$<
	
ejecutar_main: main
	@$(VALG) ./$< -r VALGRIND -d ./res/libros_cortos

ejecutar_main_consulta: main
	@$(VALG) ./$< -r VALGRIND

ejecutar_ManejadorBits: prueba_ManejadorBits
	@$(VALG) ./$<

ejecutar_IndiceMem: prueba_IndiceMem
	@$(VALG) ./$<


# LIMPIEZA
.PHONY: CleanAll
CleanAll:
	@echo "\nLIMPIEZA:"
	@$(RMDIR) $(OBJDIR)
	@echo "	. Los codigos objeto han sido borrados exitosamente!"
	@$(RM) $(EXES) $(RECURSOS)
	@echo "	. Los ejecutables y los recursos copiados han sido borrados exitosamente!"
	@$(RM) *_lexico_* *_datos_*
	@echo "	. Los archivos temporales han sido borrados exitosamente!"
	@$(RMDIR) $(TMPDIR)
	@echo "	. Los archivos temporales han sido eliminados exitosamente!\n"


